import { useUserStoreHook } from "@/store/modules/user";
import { isIncludeAllChildren, isString } from "@pureadmin/utils";
import Cookies from "js-cookie";

export interface DataInfo<T> {
  /** token */
  token: string;
  /** token的过期时间（秒） */
  expire: T;
  /** 用户信息 */
  userInfo?: {
    /** 用户ID */
    id?: string;
    /** 用户名 */
    username?: string;
    /** 昵称 */
    nickname?: string;
    /** 邮箱 */
    email?: string;
    /** 头像 */
    avatar?: string;
    /** 电话号码 */
    phone?: string;
  };
  /** 角色 */
  roles?: string[];
  /** 权限 */
  permissions?: string[];
}

export const TokenKey = "authorized-token";
/**
 * 通过`multiple-tabs`是否在`cookie`中，判断用户是否已经登录系统，
 * 从而支持多标签页打开已经登录的系统后无需再登录。
 * 浏览器完全关闭后`multiple-tabs`将自动从`cookie`中销毁，
 * 再次打开浏览器需要重新登录系统
 * */
export const multipleTabsKey = "multiple-tabs";

/** 获取`token` */
export function getToken(): DataInfo<number> {
  // 此处与`TokenKey`相同，此写法解决初始化时`Cookies`中不存在`TokenKey`报错
  return Cookies.get(TokenKey) ? JSON.parse(Cookies.get(TokenKey)) : null;
}

/**
 * @description 设置`token`以及一些必要信息
 */
export function setToken(data: DataInfo<number>) {
  const { token, expire, userInfo } = data;
  // 将过期时间（秒）转换为毫秒级时间戳
  const expiresTime = expire ? Date.now() + expire * 1000 : 0;
  const cookieString = JSON.stringify({ token, expires: expiresTime });

  // 根据后端返回的有效期设置token过期时间
  if (expire && expire > 0) {
    // 将秒转换为天
    const expiresInDays = expire / 86400;
    Cookies.set(TokenKey, cookieString, { expires: expiresInDays });
  } else {
    // 如果没有明确的过期时间，则设置为会话cookie
    Cookies.set(TokenKey, cookieString);
  }

  // 设置multiple-tabs为会话cookie
  Cookies.set(multipleTabsKey, "true");

  // 更新用户信息到store
  if (userInfo && userInfo.username) {
    useUserStoreHook().updateUserInfo({
      username: userInfo.username,
      nickname: userInfo.nickname || "",
      avatar: userInfo.avatar || "",
      phone: userInfo.phone || "",
      roles: [],
      permissions: []
    });
  }
}

/** 删除`token`以及key值为`user-info`的localStorage信息 */
export function removeToken() {
  Cookies.remove(TokenKey);
  Cookies.remove(multipleTabsKey);
}

/** 格式化token（jwt格式） */
export const formatToken = (token: string): string => {
  return "Bearer " + token;
};

/** 是否有按钮级别的权限（根据登录接口返回的`permissions`字段进行判断）*/
export const hasPerms = (value: string | Array<string>): boolean => {
  if (!value) return false;
  const allPerms = "*:*:*";
  const { permissions } = useUserStoreHook();
  if (!permissions) return false;
  if (permissions.length === 1 && permissions[0] === allPerms) return true;
  const isAuths = isString(value)
    ? permissions.includes(value)
    : isIncludeAllChildren(value, permissions);
  return isAuths ? true : false;
};
